﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CapaPresentacion.Commands;
using CapaPresentacion.Vistas;
using Entidades;
using CapaLogica;
using System.Windows.Input;
using System.Windows;
using System.Windows.Data;
using System.Transactions;
using System.Globalization;


namespace CapaPresentacion.Controles
{
    internal class NuevoTurnoViewModel
    {
        public event ReiniciarCU ReiniciarCU;

        #region Variables
        
        private Turno turno;
        private Turno turnoSinModificaciones;
        private RelayCommand saveCommand;
        private RelayCommand newCommand;
        private RelayCommand openCommand;

        // Es necesario que la Lista sea pública y esté creada a nivel de clase
        public  List<ViewEntity> ListaCiclos { get; set; }

        #endregion

        #region Propiedades
       

        public ICommand SaveCommand
        {
            get
            {
                return saveCommand;
            }
        }

        public ICommand NewCommand
        {
            get
            {
                return newCommand;
            }
        }

        public ICommand OpenCommand
        {
            get
            {
                return openCommand;
            }
        }

        public Turno Turno
        {
            get { return turno; }
            set { turno = value; }
        }

        #endregion

        #region Métodos

        public NuevoTurnoViewModel()
        {

        }

        public void inicializar()
        {
            ListaCiclos = new TurnoLogica().ObtenerCiclosLectivos();

            if (ListaCiclos.Count == 0)
            {
                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "No se han encontrado ciclos lectivos");
                nueva.ShowDialog();
                this.ReiniciarCU(CasosDeUso.NuevoCicloLectivo);

            }
            else
            {
                this.turno = new Turno();
                this.turno.Eliminado = false;
                this.saveCommand = new RelayCommand(GuardarTurno);
                this.newCommand = new RelayCommand(NuevoTurno);
                this.openCommand = new RelayCommand(AbrirTurno);
            }
            

        }

        public void inicializar(Turno entidad)
        {
            this.turno = entidad;
            this.turnoSinModificaciones = (Turno)entidad.Clone();

            this.saveCommand = new RelayCommand(GuardarTurno);
            this.newCommand = new RelayCommand(NuevoTurno);
            this.openCommand = new RelayCommand(AbrirTurno);

            ListaCiclos = new TurnoLogica().ObtenerCiclosLectivos();

        }




        private void NuevoTurno(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea cargar los datos de un nuevo turno?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.NuevoTurno);
            }
        }

        private void AbrirTurno(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea editar los datos de un turno existente?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.BuscarTurno);
            }
        }


        private void GuardarTurno(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea guardar los datos?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {


                if (Validaciones())
                {
                    try
                    {
                        this.turno.NombreTurno = CultureInfo.InvariantCulture.TextInfo.ToTitleCase(this.turno.NombreTurno);
                        this.turno.NombreSala = CultureInfo.InvariantCulture.TextInfo.ToTitleCase(this.turno.NombreSala);

                        if (turno.IdTurno == Guid.Empty) // Nuevo Turno
                        {
                            turno.IdTurno = Guid.NewGuid();
                            new TurnoLogica().Agregar(turno);

                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "El turno ha sido guardado correctamente");
                            nueva.ShowDialog();
                            this.ReiniciarCU(CasosDeUso.NuevoTurno);

                        }
                        else // Modificación de Turno
                        {
                            new TurnoLogica().Modificar(turno);

                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "El turno ha sido modificado correctamente");
                            nueva.ShowDialog();
                            this.ReiniciarCU(CasosDeUso.NuevoTurno);

                        }

                    }
                    catch (Exception)
                    {

                        VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "  Ha ocurrido un error y el turno no se ha guardado");
                        nueva.ShowDialog();
                        this.NuevoTurno(null);


                    }
                }

            }
        }

        
               

        private bool Validaciones()
        {
            if (turno.NombreTurno == null || turno.NombreTurno == "")
            {
                if (turnoSinModificaciones != null)
                    this.turno.NombreTurno = this.turnoSinModificaciones.NombreTurno;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Nombre del turno' no puede estar vacío");
                nueva.ShowDialog();
                return false;
            }

            if (turno.IdCicloLectivo == Guid.Empty )
            {
                if(turnoSinModificaciones != null)
                    this.turno.IdCicloLectivo = this.turnoSinModificaciones.IdCicloLectivo;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "Debe seleccionar un Ciclo Lectivo");
                nueva.ShowDialog();
                return false;

            }

            

            if (turno.HoraInicio > turno.HoraFin)
            {
                if (turnoSinModificaciones != null)
                {
                    this.turno.HoraInicio = this.turnoSinModificaciones.HoraInicio;
                    this.turno.HoraFin = this.turnoSinModificaciones.HoraFin;
                }
                
                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "La 'Hora de Inicio' debe ser menor que la 'Hora de fin'");
                nueva.ShowDialog();
                return false;
            }

            if (turno.HoraInicio == turno.HoraFin && turno.MinutosInicio > turno.MinutosFin)
            {
                if (turnoSinModificaciones != null)
                {
                    this.turno.HoraInicio = this.turnoSinModificaciones.HoraInicio;
                    this.turno.HoraFin = this.turnoSinModificaciones.HoraFin;
                }
                    
                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "La 'Hora de Inicio' debe ser menor que la 'Hora de fin'");
                nueva.ShowDialog();
                return false;
            }

            if (turno.HoraInicio < 8)
            {
                if (turnoSinModificaciones != null)
                {
                    this.turno.HoraInicio = this.turnoSinModificaciones.HoraInicio;
                }

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "No se permiten turnos que comiencen antes de las 8 horas");
                nueva.ShowDialog();
                return false;
            }

            if (turno.HoraFin > 18)
            {
                if (turnoSinModificaciones != null)
                {
                    this.turno.HoraFin = this.turnoSinModificaciones.HoraFin;
                }

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "No se permiten turnos que finalicen después de las 19 horas");
                nueva.ShowDialog();
                return false;
            }





            if (turno.NombreTurno == null || turno.NombreTurno == "")
            {
                if (turnoSinModificaciones != null)
                    this.turno.NombreTurno = this.turnoSinModificaciones.NombreTurno;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Nombre del turno' no puede estar vacío");
                nueva.ShowDialog();
                return false;
            }
            else
            {
                if (new TurnoLogica().ExisteNombreTurno(turno))
                {

                    if (turnoSinModificaciones != null)
                        this.turno.NombreTurno = this.turnoSinModificaciones.NombreTurno;

                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "No se permiten dos turnos con el mismo nombre en un mismo ciclo lectivo");
                    nueva.ShowDialog();
                    return false;


                }



            }


            if (turno.NombreSala == null || turno.NombreSala == "")
            {
                if (turnoSinModificaciones != null)
                    this.turno.NombreSala = this.turnoSinModificaciones.NombreSala;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Nombre de la Sala' no puede estar vacío");
                nueva.ShowDialog();
                return false;
            }
           



            if (turno.CupoMaximo == 0)
            {
                if (turnoSinModificaciones != null)
                    this.turno.CupoMaximo = this.turnoSinModificaciones.CupoMaximo;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El Cupo máximo no puede estar vacío o tener valor cero");
                nueva.ShowDialog();
                return false;
            }
           

            if (turno.CupoMinimo == 0)
            {
                if (turnoSinModificaciones != null)
                    this.turno.CupoMinimo = this.turnoSinModificaciones.CupoMinimo;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El Cupo mínimo no puede estar vacío o tener valor cero");
                nueva.ShowDialog();
                return false;
            }

            if (turno.CupoMaximo <= turno.CupoMinimo)
            {
                if (turnoSinModificaciones != null)
                {
                    this.turno.CupoMaximo = this.turnoSinModificaciones.CupoMaximo;
                    this.turno.CupoMinimo = this.turnoSinModificaciones.CupoMinimo;

                }
                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El Cupo máximo no puede ser menor al cupo mínimo");
                nueva.ShowDialog();
                return false;
            }


            DateTime temp1 = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, turno.HoraFin, turno.MinutosFin, 0);
            DateTime temp2 = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, turno.HoraInicio, turno.MinutosInicio, 0);
            TimeSpan resta = temp1.Subtract(temp2);
            
            if (resta.Hours < 2)
            {
                if (turnoSinModificaciones != null)
                {
                    this.turno.HoraInicio = this.turnoSinModificaciones.HoraInicio;
                    this.turno.HoraFin = this.turnoSinModificaciones.HoraFin;
                }

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El turno no puede durar menos de dos horas");
                nueva.ShowDialog();
                return false;
            }

            if (resta.Hours > 5)
            {
                if (turnoSinModificaciones != null)
                {
                    this.turno.HoraInicio = this.turnoSinModificaciones.HoraInicio;
                    this.turno.HoraFin = this.turnoSinModificaciones.HoraFin;
                }

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El turno debe durar menos de seis horas");
                nueva.ShowDialog();
                return false;
            }

            return true;
        }

        #endregion




    }
}
